import express from "express";
import cors from "cors";
import routers from "./core/routers/index.js";
import loginRoutes from "./core/routers/admin/login.js";
import clientRoutes from "./core/routers/client/index.js";
import adminRoutes from "./core/routers/admin/index.js";
import { db } from "./config/sequelize.js"; // 导入数据库单例
import path from "path";
import { ProductService } from "./services/product.service.js";
import { errorHandler } from "./core/middleware/errorHandler.js";

import fs from "fs";
import { fileURLToPath } from "url";

// 获取 __dirname 的等效值
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();
// 允许所有来源（仅限开发环境）
// app.use(cors());

// 或仅允许特定来源（生产环境推荐）
app.use(
  cors({
    origin: ["http://localhost:8005", "http://localhost:3005"], // 你的前端地址
    methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
    allowedHeaders: ["Content-Type", "Authorization"],
    exposedHeaders: ["Content-Length", "Content-Range"],
    credentials: true, // 允许发送 cookies 等凭证
  })
);

// 先注册调试中间件
app.use((req, res, next) => {
  console.log("\n=== 请求进入 ===", req.method, req.originalUrl);
  next(); // 必须调用！
});

// 3. 静态文件服务（增强版）
const projectRoot = path.resolve(__dirname, '..'); // 向上退一级到项目根目录
const uploadsPath = path.join(projectRoot, 'uploads');
// 确保uploads目录存在
if (!fs.existsSync(uploadsPath)) {
  console.error(`错误：uploads目录不存在于 ${uploadsPath}`);
  process.exit(1);
}
app.use('/uploads', (req, res, next) => {
  const filePath = path.join(uploadsPath, req.path);
  
  // 安全验证
  if (!filePath.startsWith(uploadsPath)) {
    return res.status(403).send("Forbidden");
  }

  // 设置正确的Content-Type
  const ext = path.extname(filePath).toLowerCase();
  const mimeTypes = {
    '.jpg': 'image/jpeg',
    '.jpeg': 'image/jpeg',
    '.png': 'image/png',
    '.gif': 'image/gif',
    '.webp': 'image/webp',
    '.m3u8': 'application/vnd.apple.mpegurl',
    '.ts': 'video/MP2T',
    '.mp4': 'video/mp4'
  };

  if (mimeTypes[ext]) {
    res.setHeader('Content-Type', mimeTypes[ext]);
  }

  // 禁用缓存
  res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
  res.setHeader('Pragma', 'no-cache');
  res.setHeader('Expires', '0');

  next();
}, express.static(uploadsPath));

// 公共中间件
app.use(express.json());
// 在所有中间件后添加错误处理
app.use((err, req, res, next) => {
  console.error("全局错误:", err);
  res.status(500).send("Server Error");
});
// 接口路由分离
app.use("/api", loginRoutes); // 登录接口
app.use("/api/main", routers); // 后台接口
app.use("/api/client", clientRoutes); // 客户端接口
app.use("/api", adminRoutes); // 管理后台接口

// 错误处理中间件
// app.js 或主入口文件
app.use((err, req, res, next) => {
  console.error(`[Error] ${err.name}: ${err.message}`);

  const statusCode = err.statusCode || 500;
  const response = {
    success: false,
    error: {
      name: err.name,
      message: err.message,
      ...(process.env.NODE_ENV === "development" && { stack: err.stack }),
    },
  };

  if (err.details) {
    response.error.details = err.details;
  }

  res.status(statusCode).json(response);
});
// 启动应用
// 应用启动函数
async function startApp() {
  try {
    // 1. 测试数据库连接
    await db.testConnection();
    // 2. 注册模型
    db.registerModels();
    // 2. 注册并同步模型
    await db.syncModels({
      alter: process.env.NODE_ENV === "development", // 仅开发环境使用alter
      // force: true // 危险！仅开发环境需要重置表时使用
    });
    // 4. 现在可以安全创建服务实例
    const productService = new ProductService(db);
    // 3. 将服务实例附加到app（供路由使用）
    app.set("productService", productService);
    // 6. 启动服务器
    const PORT = process.env.PORT || 3000;
    // 3. 启动服务器
    app.listen(PORT, () => {
      console.log(`Server running on port ${PORT}`);
      console.log(`Environment: ${process.env.NODE_ENV || "development"}`);
    });
  } catch (error) {
    console.error("应用启动失败:", error);
    process.exit(1);
  }
}

// 启动应用
startApp();
